﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AcessaDadosBD;
using AcessaDadosBD.Repositorios;
using System.Drawing.Imaging;
using System.IO;
using docTissV2.Classes;

namespace docTissV2
{
    public partial class uc_Operadora : UserControl
    {

        #region Propriedades

        private string oldRegistroANS = "";
        private bool updateOp = false;      

        OperadoraRepository operadora = new OperadoraRepository(AddinUtils.Command);
        PrestadorRepository prestador = new PrestadorRepository(AddinUtils.Command);
        OperadoraPrestadorRepository operadoraPrestador = new OperadoraPrestadorRepository(AddinUtils.Command);
        Operadora operadoraEntity = new Operadora();
        OperadoraPrestador operadoraPrestadorEntity = new OperadoraPrestador();

        #endregion

        #region Métodos

        private void carregaOpCadastradas()
        {
            var operadoras = operadora.GetAll();

            btnExcluirOp.Enabled = false;
            foreach (var op in operadoras)
            {
                ListViewItem item = new ListViewItem(op.Nome);
                item.SubItems.Add(op.RegistroANS);
                lvOpCadastradas.Items.Add(item);
            }
        }

        private void limpaCamposOp()
        {
            foreach (Control ctrl in this.gpbOperadora.Controls)
            {
                if (ctrl is TextBox)
                    ctrl.Text = "";
                else if (ctrl is MaskedTextBox)
                    ctrl.Text = "";
            }
            pbxLogo.Image = null;
        }

        private void btnOperadoraOperacaoConcluido()
        {
            this.limpaCamposOp();
            lvOpCadastradas.Items.Clear();
            this.carregaOpCadastradas();
            gpbOperadora.Enabled = false;
            btnSalvarOp.Enabled = false;
            btnCancelarOp.Enabled = false;
            btnNovoOp.Enabled = true;
            btnExcluirOp.Enabled = false;
        }

        #endregion

        #region Eventos

        public void Initialize()
        {
          
        }

        public uc_Operadora()
        {
            InitializeComponent();
        }

        private void btnNovoOp_Click(object sender, EventArgs e)
        {
            gpbOperadora.Enabled = true;
            updateOp = false;
            btnSalvarOp.Enabled = true;
            btnExcluirOp.Enabled = false;
            btnNovoOp.Enabled = false;
            btnCancelarOp.Enabled = true;
            this.limpaCamposOp();
        }
        
       private void uc_Operadora_Load(object sender, EventArgs e)
        {           
            carregaOpCadastradas();
        }

        private void btnExcluirOp_Click(object sender, EventArgs e)
        {

            if (lvOpCadastradas.SelectedIndices.Count > 0)
            {
                int codigoOperadora = Convert.ToInt32(lvOpCadastradas.Items[lvOpCadastradas.SelectedIndices[0]].SubItems[1].Text);
                var query = from o in operadora.GetAll()
                            from op in operadoraPrestador.GetAll()
                            where op.RegistroANS == o.RegistroANS
                            select new
                            {
                                op.ID
                            };
                foreach (var id_OperadoraPrestador in query)
                    operadoraPrestadorEntity.ID = id_OperadoraPrestador.ID;

                if (operadoraPrestadorEntity.ID == 0)
                {
                    if (MessageBox.Show("Deseja excluir esta operadora?",
                           "Aviso!", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        operadora.Delete(operadoraEntity);
                        MessageBox.Show(btnExcluirOp, "Operadora Excluída");
                        this.btnOperadoraOperacaoConcluido();
                    }
                }
                else
                {
                    if (MessageBox.Show("Esta Operadora está vinculada a algum Prestador, deseja excluir mesmo assim?",
                         "Aviso!", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        operadoraPrestador.Delete(operadoraPrestadorEntity);
                        operadora.Delete(operadoraEntity);
                        MessageBox.Show(btnExcluirOp, "Operadora Excluída");
                        this.btnOperadoraOperacaoConcluido();
                    }
                }
            }

            else
            {
                MessageBox.Show("Selecione uma operadora!",
                                     "Aviso!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            
        }

        private void lvOpCadastradas_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (lvOpCadastradas.SelectedItems.Count > 0)
            {
                this.limpaCamposOp();
                updateOp = true;
                operadoraEntity = operadora.GetById(lvOpCadastradas.Items[lvOpCadastradas.SelectedIndices[0]].SubItems[1].Text);
                oldRegistroANS = txtRegistroANS.Text = operadoraEntity.RegistroANS;
                txtNomeOp.Text = operadoraEntity.Nome;

                if (operadoraEntity.Logo != null)
                {
                    if (operadoraEntity.Logo.Length > 0)
                    {
                        Stream strImg = new MemoryStream(operadoraEntity.Logo);
                        pbxLogo.Image = new Bitmap(Image.FromStream(strImg), 83, 51);
                    }
                }

                gpbOperadora.Enabled = true;
                btnSalvarOp.Enabled = true;
                btnExcluirOp.Enabled = true;
                btnNovoOp.Enabled = true;
            }
        }

        private void btnLogo_Click(object sender, EventArgs e)
        {
            if (ofdLogo.ShowDialog() == DialogResult.OK)
            {
                Image img = new Bitmap(ofdLogo.FileName);
                pbxLogo.Image = new Bitmap(img, 83, 51);
            }
        }

        private void btnCancelarOp_Click(object sender, EventArgs e)
        {
            gpbOperadora.Enabled = false;
            btnCancelarOp.Enabled = false;
            btnSalvarOp.Enabled = false;
            btnExcluirOp.Enabled = false;
            btnNovoOp.Enabled = true;
            this.limpaCamposOp();
        }

        private void btnSalvarOp_Click(object sender, EventArgs e)
        {
            if (txtRegistroANS.Text.Contains("_"))
                MessageBox.Show(txtRegistroANS, "Registro ANS deve ter 6 dígitos");
            else if (txtNomeOp.Text == "")
                MessageBox.Show(txtNomeOp, "O Nome deve ser Preenchido!");
            else
            {
                MemoryStream str = new MemoryStream();
                if (pbxLogo.Image != null)
                    pbxLogo.Image.Save(str, ImageFormat.Png);
                byte[] br = str.ToArray();

                if (updateOp)
                {
                    if (MessageBox.Show("Deseja alterar esta Operadora?",
                         "Mensagem", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        operadoraEntity.RegistroANS = txtRegistroANS.Text;
                        operadoraEntity.Nome = txtNomeOp.Text;
                        operadoraEntity.Logo = br;

                        if (oldRegistroANS == txtRegistroANS.Text)
                        {
                            operadora.Update(operadoraEntity);

                            MessageBox.Show("Cadastro alterado");
                            this.btnOperadoraOperacaoConcluido();
                        }

                        else
                        {
                            if (operadora.GetById(txtRegistroANS.Text) == null)
                            {
                                operadoraEntity.RegistroANS = oldRegistroANS;
                                operadora.Delete(operadoraEntity);
                                operadoraEntity.RegistroANS = txtRegistroANS.Text;
                                operadora.Insert(operadoraEntity);

                                MessageBox.Show("Cadastro alterado");
                                this.btnOperadoraOperacaoConcluido();
                            }
                            else
                            {
                                MessageBox.Show("Alguma Operadora ja utiliza este Registro ANS!", "Aviso!",
                                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            }
                        }
                    }
                }
                else
                {
                    if (operadora.GetById(txtRegistroANS.Text) == null)
                    {
                        operadoraEntity.RegistroANS = txtRegistroANS.Text;
                        operadoraEntity.Nome = txtNomeOp.Text;
                        operadoraEntity.Logo = br;
                        operadora.Insert(operadoraEntity);
                        MessageBox.Show("Cadastro efetuado");
                        this.btnOperadoraOperacaoConcluido();
                    }
                    else
                    {
                        MessageBox.Show("Alguma Operadora ja utiliza este Registro ANS!", "Aviso!",
                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
        }

        #endregion

    }
}
